UP | HOME

Golang Guards

golang 的 defer 机制用来在函数返回时执行清理操作。 本文讲述的小技巧是利用返回类型为 func() 的函数作为 guard function。

func guard() func() {
        fmt.Println("Guarding...")
        return func() { fmt.Println("Leaving...") }
}

func f() {
        defer guard()()
        fmt.Println("Do something...")
}

f() 运行的输出是

Guarding...
Do something...
Leaving...

这样的函数作 guard 尤为方便,比如用来实现类似 C++ 的 std::lock_guard

func LockGuard(m *sync.Mutex) func() {
        m.Lock()
        return m.Unlock
}

之所以说是“类似”,是因为 C++ 中析构函数在离开当前作用域时被调用,而 golang 的 defer 则是在离开函数的时候被调用,生命周期有一点区别。